Skip to content

fix: restore OAuth token expiry across process restarts - #3248

Closed
dhruvkej9 wants to merge 2 commits into
modelcontextprotocol:mainfrom
dhruvkej9:fix/restore-token-expiry-on-init
Closed

fix: restore OAuth token expiry across process restarts#3248
dhruvkej9 wants to merge 2 commits into
modelcontextprotocol:mainfrom
dhruvkej9:fix/restore-token-expiry-on-init

Conversation

@dhruvkej9

@dhruvkej9 dhruvkej9 commented Aug 4, 2026

Copy link
Copy Markdown

Problem

OAuthClientProvider._initialize (and the client-credentials providers) reloads current_tokens from storage but never restores token_expiry_time. The persisted OAuthToken only carries the relative expires_in, so on a fresh process is_token_valid() returns True for an already-expired access token — a stale Bearer is sent and a 401 round-trip is wasted before re-authentication (mcp2cli issues #50, #57).

Fix

Persist the absolute expiry and restore it on init:

  • Add expires_at: float | None to OAuthToken (absolute unix timestamp), with a doc comment explaining the mcp2cli reproduction that motivated it.
  • Set it when tokens are stored (_handle_token_response, _handle_refresh_response).
  • Add OAuthContext.restore_token_expiry() and call it from all three _initialize methods (base, ClientCredentialsOAuthProvider, PrivateKeyJwtOAuthProvider).

Backwards compatible: expires_at defaults to None; existing stored tokens simply re-auth once, then persist the absolute expiry going forward.

Test

test_init_restores_expired_token_expiry — fails on main (expired token reported valid), passes with the fix. 210 auth tests pass, ruff + pyright clean.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 4 files

Re-trigger cubic

@github-actions github-actions Bot added the missing-issue-link Auto-closed: PR needs a linked issue assigned to its author (see CONTRIBUTING.md) label Aug 17, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Thanks for the contribution. This repository only keeps pull requests open when they're linked to an issue that a maintainer has assigned to the author — CONTRIBUTING.md explains why and how we work. This PR has been closed for now because its description doesn't yet link an open issue in this repository (with Fixes #123 or similar).

If there isn't an issue for this yet, please open one — a clear description of the problem is genuinely the most useful thing for us. Then add Fixes #<number> to this PR's description. If a maintainer would like the change as a PR from you, they'll assign you to the issue and this PR will reopen automatically.

There's no need to open a new PR — this one will be reopened. While it's closed, please push any updates as new commits rather than force-pushing, since GitHub can't reopen a PR whose branch has been rewritten.

Maintainers: reopening this PR, removing the missing-issue-link label, or adding bypass-issue-check bypasses the check.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

missing-issue-link Auto-closed: PR needs a linked issue assigned to its author (see CONTRIBUTING.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant